﻿#include "texture.h"
#include<iostream>
using namespace std;
Texture::Texture(const char* filename,int unit):mUnit(unit)
{

	int channels=0;
	//反转Y轴
	stbi_set_flip_vertically_on_load(true);
	//加载数据到内存
	stbi_uc* data = stbi_load(filename, &mWidth, &mHeight,
		&channels, STBI_default);

	printf("Error: %s\n", stbi_failure_reason());
	//创建纹理
	glGenTextures(1, &mTexture);
	//激活纹理
	glActiveTexture(GL_TEXTURE0+mUnit);
	//绑定纹理
	glBindTexture(GL_TEXTURE_2D, mTexture);
	//将数据传输到显存中
	GLenum format = channels == 3 ? GL_RGB : GL_RGBA;
	GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, format, mWidth, mHeight, 0, format, GL_UNSIGNED_BYTE, data));
	glGenerateMipmap(GL_TEXTURE_2D);
	//int width = mWidth;
	//int height = mHeight;
	//for (int level = 0; true; level++) {
	//	//将当前级别的mipmap对应数据发往GPU端
	//	glTexImage2D(GL_TEXTURE_2D, level, format, width, height, 0, format,GL_UNSIGNED_BYTE, data);

	//	//判断是否退出循环
	//	if (width == 1 && height == 1) {
	//		break;
	//	}
	//	//计算下一级mipmap的宽度与高度
	//	width= width > 1 ? width / 2 : 1;
	//	height = height > 1 ? height / 2 : 1;
	//}
	//glGenerateMipmap(GL_TEXTURE_2D);
	//传输完毕，将图片数据从内存中删除
	stbi_image_free(data);
	//设置纹理的过滤方式
	GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));//对于目标2D插槽（参数一），如果图片像素大于填充区域像素（参数二），则使用双线性填充方式（参数三）
	GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST));//对于目标2D插槽（参数一），如果图片像素小于填充区域像素（参数二），则使用最近像素填充方式（参数三）
	//设置纹理的包裹方式（平铺方式）
	GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT));//S对应u,也就是x轴方向
	GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT));//T对应v,也就是Y轴方向

}

Texture::~Texture()
{
}

void Texture::bind()
{
	//激活纹理
	glActiveTexture(GL_TEXTURE0 + mUnit);
	//绑定纹理
	glBindTexture(GL_TEXTURE_2D, mTexture);
}
